#include "stdafx.h"
#include "CppUnitTest.h"
#include "DSInterfaceWrapper.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest_LinkedStack
{
	void testIntLinkedStack();
	void testIntConcurrentLinkedStack();
	void testLinkedStack(NativeIntLinkedStack* a_pNativeIntArrayStack);

	TEST_CLASS(TestLinkedStackClass)
	{
	public:
		
		TEST_METHOD(LinkedStack)
		{
			testIntLinkedStack();
		}

		TEST_METHOD(ConcurrentLinkedStack)
		{
			testIntConcurrentLinkedStack();
		}

	};

	void testIntLinkedStack() {
		NativeIntLinkedStack intLinkedStack(5, false);
		testLinkedStack(&intLinkedStack);
	}

	void testIntConcurrentLinkedStack() {
		NativeIntLinkedStack intLinkedStack(5, true);
		testLinkedStack(&intLinkedStack);
	}

	void testLinkedStack(NativeIntLinkedStack* a_pNativeIntLinkedStack) {
		int debugPoppedValue[5] = {5, 4, 3, 2, 1};

		for(int data = 1; data < 11; data++) {
			if(a_pNativeIntLinkedStack->canPush()) {
				a_pNativeIntLinkedStack->push(data);
			}
		}

		Assert::AreEqual(a_pNativeIntLinkedStack->getDataCount(), 5);

		for(int index = 0; index < 10; index++) {
			if(a_pNativeIntLinkedStack->canPop()) {
				int value = a_pNativeIntLinkedStack->pop();
				Assert::AreEqual(value, debugPoppedValue[index]);
			}
		}

	}
}